package br.com.pnfp.web.model.dao.mysql;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import br.com.pnfp.web.model.dao.ILocalidadeDAO;
import br.com.pnfp.web.model.enums.Ativo;
import br.com.pnfp.web.model.enums.UF;
import br.com.pnfp.web.model.vo.Cidade;
import br.com.pnfp.web.model.vo.Localidade;
import br.com.pnfp.web.model.vo.TipoLocalidade;

@Repository
public class LocalidadeDAO extends DAO implements ILocalidadeDAO {

	@Override
	public List<Localidade> consultar(Localidade vo) {

		String sql = "SELECT localidade.cd_localidade, localidade.nm_localidade, localidade.cd_tipo_localidade, tipo.dc_tipo_localidade, localidade.cd_cidade, cidade.nm_cidade, cidade.sg_uf, localidade.dc_endereco, localidade.dc_bairro, localidade.dc_complemento, localidade.dc_cep, localidade.id_ativo " +
				"FROM tb_localidade localidade, tb_tipo_localidade tipo, tb_cidade cidade where ";
		Object[] params = {};
		if(vo.getCodigo() != null) {
			sql += "localidade.cd_localidade = ? and ";
			params = new Object[]{vo.getCodigo()};
		} else if(vo.getNome() != null && !vo.getNome().equals("")) {
			sql += "localidade.nm_localidade like ? and ";
			String desc = vo.getNome() + "%";
			params = new Object[]{desc};
		} else if(vo.getTipoLocalidade() != null && vo.getTipoLocalidade().getCodigo() != null && vo.getTipoLocalidade().getCodigo() > 0) {
			sql += "tipo.cd_tipo_localidade = ? and ";
			params = new Object[]{vo.getTipoLocalidade().getCodigo()};
		} else if(vo.getCidade() != null && vo.getCidade().getUf() != null) {
			sql += "cidade.sg_uf = ? and ";
			params = new Object[]{vo.getCidade().getUf().name()};			
		}
		sql += "localidade.cd_tipo_localidade = tipo.cd_tipo_localidade and localidade.cd_cidade = cidade.cd_cidade and localidade.id_ativo = 1 order by localidade.nm_localidade";

		List<Localidade> result = query(sql, params, new RowMapper<Localidade>() {
			@Override
			public Localidade mapRow(ResultSet rs, int arg1) throws SQLException {
				Localidade vo = new Localidade();
				vo.setCodigo(rs.getInt("localidade.cd_localidade"));
				vo.setNome(rs.getString("localidade.nm_localidade"));
				vo.setTipoLocalidade(new TipoLocalidade(rs.getInt("localidade.cd_tipo_localidade")));
				vo.getTipoLocalidade().setDescricao(rs.getString("tipo.dc_tipo_localidade"));
				vo.setCidade(new Cidade(rs.getInt("localidade.cd_cidade")));
				vo.getCidade().setNome(rs.getString("cidade.nm_cidade"));
				vo.getCidade().setUf(UF.valueOf(rs.getString("sg_uf")));
				vo.setEndereco(rs.getString("localidade.dc_endereco"));
				vo.setBairro(rs.getString("localidade.dc_bairro"));
				vo.setComplemento(rs.getString("localidade.dc_complemento"));
				vo.setCep(rs.getString("localidade.dc_cep"));
				vo.setAtivo(Ativo.setValue(rs.getInt("localidade.id_ativo")));
				return vo;
			}
			
		});		
		
		return result;
	}
	
	@Override
	public void incluir(Localidade vo) {
		String sql = "INSERT INTO tb_localidade(nm_localidade, cd_tipo_localidade, cd_cidade, dc_endereco, dc_bairro, dc_complemento, dc_cep, id_ativo) values(?,?,?,?,?,?,?,?)";
		update(sql, new Object[] {vo.getNome(), vo.getTipoLocalidade().getCodigo(), vo.getCidade().getCodigo(), vo.getEndereco(), vo.getBairro(), vo.getComplemento(), vo.getCep(), 1});
	}
	
	@Override
	public void alterar(Localidade vo) {
		String sql = "UPDATE tb_localidade set nm_localidade = ?, cd_tipo_localidade = ?, cd_cidade = ?, dc_endereco = ?, dc_bairro = ?, dc_complemento = ?, dc_cep = ? where cd_localidade = ?";
		update(sql, new Object[] {vo.getNome(), vo.getTipoLocalidade().getCodigo(), vo.getCidade().getCodigo(), vo.getEndereco(), vo.getBairro(), vo.getComplemento(), vo.getCep(), vo.getCodigo()});
	}
	
	@Override
	public void excluir(Integer id) {
		try {
			String sql = "DELETE FROM tb_localidade where cd_localidade = ?";
			update(sql, new Object[] {id});
		} catch(DataIntegrityViolationException e) { 
			String sql = "UPDATE tb_localidade set id_ativo = 0 where cd_localidade = ?";
			update(sql, new Object[] {id});		
		}
	}

}
